package com.smart.community.property.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.smart.community.property.dto.RepairOrderWorkDTO;
import com.smart.community.property.entity.RepairOrder;
import com.smart.community.property.vo.RepairOrderWorkVO;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;

/**
 * 维修工单工作管理扩展服务接口
 *
 * @author Wu.Liang
 * @since 2025-01-30
 * @version 1.0.0
 */
public interface IRepairOrderWorkService extends IService<RepairOrder> {

    /**
     * 分页查询维修工单（工作管理扩展）
     *
     * @param current 当前页
     * @param size 每页大小
     * @param params 查询参数
     * @return 维修工单分页数据
     */
    IPage<RepairOrderWorkVO> getRepairOrderWorkPage(Integer current, Integer size, Map<String, Object> params);

    /**
     * 根据ID查询维修工单详情（工作管理扩展）
     *
     * @param id 维修工单ID
     * @return 维修工单详情
     */
    RepairOrderWorkVO getRepairOrderWorkById(Long id);

    /**
     * 新增维修工单（工作管理扩展）
     *
     * @param repairOrderWorkDTO 维修工单DTO
     * @return 是否成功
     */
    boolean addRepairOrderWork(RepairOrderWorkDTO repairOrderWorkDTO);

    /**
     * 更新维修工单（工作管理扩展）
     *
     * @param repairOrderWorkDTO 维修工单DTO
     * @return 是否成功
     */
    boolean updateRepairOrderWork(RepairOrderWorkDTO repairOrderWorkDTO);

    /**
     * 分配维修工单
     *
     * @param orderId 工单ID
     * @param repairmanId 维修人员ID
     * @param estimatedCompleteTime 预计完成时间
     * @param remark 分配备注
     * @return 是否成功
     */
    boolean assignRepairOrder(Long orderId, Long repairmanId, String estimatedCompleteTime, String remark);

    /**
     * 批量分配维修工单
     *
     * @param orderIds 工单ID列表
     * @param repairmanId 维修人员ID
     * @param estimatedCompleteTime 预计完成时间
     * @return 分配结果统计
     */
    Map<String, Integer> batchAssignRepairOrders(List<Long> orderIds, Long repairmanId, String estimatedCompleteTime);

    /**
     * 开始维修
     *
     * @param orderId 工单ID
     * @param materialList 材料清单
     * @param remark 开始维修备注
     * @return 是否成功
     */
    boolean startRepair(Long orderId, List<String> materialList, String remark);

    /**
     * 完成维修
     *
     * @param orderId 工单ID
     * @param repairResult 维修结果
     * @param repairCost 维修费用
     * @param workHours 工时
     * @param remark 完成备注
     * @return 是否成功
     */
    boolean completeRepair(Long orderId, String repairResult, String repairCost, String workHours, String remark);

    /**
     * 提交客户评价
     *
     * @param orderId 工单ID
     * @param satisfaction 满意度评分
     * @param comment 客户评价
     * @return 是否成功
     */
    boolean submitCustomerRating(Long orderId, Integer satisfaction, String comment);

    /**
     * 设置回访
     *
     * @param orderId 工单ID
     * @param followUpTime 回访时间
     * @param remark 回访备注
     * @return 是否成功
     */
    boolean setFollowUp(Long orderId, String followUpTime, String remark);

    /**
     * 完成回访
     *
     * @param orderId 工单ID
     * @param followUpResult 回访结果
     * @return 是否成功
     */
    boolean completeFollowUp(Long orderId, String followUpResult);

    /**
     * 通知客户
     *
     * @param orderId 工单ID
     * @param notificationMethod 通知方式
     * @param content 通知内容
     * @return 是否成功
     */
    boolean notifyCustomer(Long orderId, Integer notificationMethod, String content);

    /**
     * 查询维修人员工单
     *
     * @param repairmanId 维修人员ID
     * @param propertyCompanyId 物业公司ID
     * @param status 工单状态
     * @return 工单列表
     */
    List<RepairOrderWorkVO> getRepairOrdersByRepairman(Long repairmanId, Long propertyCompanyId, Integer status);

    /**
     * 查询紧急工单
     *
     * @param propertyCompanyId 物业公司ID
     * @return 紧急工单列表
     */
    List<RepairOrderWorkVO> getUrgentRepairOrders(Long propertyCompanyId);

    /**
     * 查询超时工单
     *
     * @param propertyCompanyId 物业公司ID
     * @param timeoutHours 超时小时数
     * @return 超时工单列表
     */
    List<RepairOrderWorkVO> getTimeoutRepairOrders(Long propertyCompanyId, Integer timeoutHours);

    /**
     * 查询待分配工单
     *
     * @param propertyCompanyId 物业公司ID
     * @return 待分配工单列表
     */
    List<RepairOrderWorkVO> getPendingAssignRepairOrders(Long propertyCompanyId);

    /**
     * 查询进行中工单
     *
     * @param propertyCompanyId 物业公司ID
     * @return 进行中工单列表
     */
    List<RepairOrderWorkVO> getInProgressRepairOrders(Long propertyCompanyId);

    /**
     * 查询已完成工单
     *
     * @param propertyCompanyId 物业公司ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 已完成工单列表
     */
    List<RepairOrderWorkVO> getCompletedRepairOrders(Long propertyCompanyId, LocalDate startDate, LocalDate endDate);

    /**
     * 查询维修工单统计信息
     *
     * @param propertyCompanyId 物业公司ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 统计信息
     */
    Map<String, Object> getRepairOrderWorkStatistics(Long propertyCompanyId, LocalDate startDate, LocalDate endDate);

    /**
     * 查询维修人员工作量统计
     *
     * @param repairmanId 维修人员ID
     * @param propertyCompanyId 物业公司ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 工作量统计
     */
    Map<String, Object> getRepairmanWorkloadStatistics(Long repairmanId, Long propertyCompanyId, LocalDate startDate, LocalDate endDate);

    /**
     * 查询工单类型统计
     *
     * @param propertyCompanyId 物业公司ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 工单类型统计
     */
    Map<String, Object> getRepairOrderTypeStatistics(Long propertyCompanyId, LocalDate startDate, LocalDate endDate);

    /**
     * 查询客户满意度统计
     *
     * @param propertyCompanyId 物业公司ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 满意度统计
     */
    Map<String, Object> getCustomerSatisfactionStatistics(Long propertyCompanyId, LocalDate startDate, LocalDate endDate);

    /**
     * 获取工单来源列表
     *
     * @return 工单来源列表
     */
    List<Map<String, Object>> getRepairOrderSourceList();

    /**
     * 获取工单分类列表
     *
     * @return 工单分类列表
     */
    List<Map<String, Object>> getRepairOrderCategoryList();

    /**
     * 获取通知方式列表
     *
     * @return 通知方式列表
     */
    List<Map<String, Object>> getNotificationMethodList();
}
